﻿#ifndef __AF_DEFINE_H__
#define __AF_DEFINE_H__

#include "AF_Setting.h"
#include "AF_SysIncDef.h"
#include "AF_Type.h"

#pragma warning(disable:4100)	// 未引用形参

// ****** 常数状态 ******
#ifndef NULL
/// 空值
#define NULL			0
#endif
/// 整型空值
#define NULL_INT		-999999999

/// 不限画面更新次数
#define AF_FPS_NONE		0
/// 默认画面更新次数
#define AF_FPS_DEFAULT		20

// ****** 操作 ******
/// 绝对值操作
#define AF_ABS_NUM(_nNum)		((_nNum) >=0 ? (_nNum) : -(_nNum))
/// 最大值操作
#define AF_MAX_NUM(_nNum1, _nNum2)	(((_nNum1) > (_nNum2)) ? (_nNum1) : (_nNum2))
/// 最小值操作
#define AF_MIN_NUM(_nNum1, _nNum2)	(((_nNum1) < (_nNum2)) ? (_nNum1) : (_nNum2))
/// 中间值操作
#define AF_MID_NUM(_nNum1, _nNum2)	(((_nNum1) + (_nNum2)) >> 1)
/// 类型判断操作
#define AF_KINDOF(_TYPE1, _TYPE2)	(typeid(_TYPE1) == typeid(_TYPE2))

namespace AF
{
	/// 全局n次方
	inline int			Power(int nNum, int nPower);
}
/// n次方操作
#define AF_POWER(_nNum, _nPower)	(AF::Power((_nNum), (_nPower)))



// ****** 父类指针 ******
// #define SUPER(_KIND)			(AF_KINDOF(this, _KIND) ? ((_KIND*)this) : NULL)
#define SUPER(_KIND)			((_KIND*)this)


// ****** 属性定义 ******
/// 属性成员变量
#define ATTRIB(_Name)			m_atb##_Name

/// 定义只读属性
#define DIM_ATTRIB_R(_TYPE, _Name) \
	protected: \
		_TYPE ATTRIB(_Name); \
	public: \
		virtual inline _TYPE& Get##_Name() {return ATTRIB(_Name);}
/// 定义属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB(_TYPE, _Name) \
		DIM_ATTRIB_R(_TYPE, _Name) \
		virtual inline void Set##_Name(_TYPE val) {ATTRIB(_Name) = val;}

/// 定义只读数组属性
#define DIM_ATTRIB_ARRAY_R(_TYPE, _Name, _nSize) \
	protected: \
		_TYPE ATTRIB(_Name)[_nSize]; \
	public: \
		virtual inline _TYPE* Get##_Name() {return ATTRIB(_Name);}
/// 定义数组属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB_ARRAY(_TYPE, _Name, _nSize) \
		DIM_ATTRIB_ARRAY_R(_TYPE, _Name, _nSize) \
		virtual inline void Set##_Name(_TYPE* pval) \
		{ \
			for(int _i = 0; _i < _nSize; _i++) \
				ATTRIB(_Name)[_i] = pval[_i]; \
		}

/// 定义只读关联属性
#define DIM_ATTRIB_ASSOCIATED_R(_TYPE, _Name, _Arg) \
	public: \
		virtual inline _TYPE& Get##_Name() {return _Arg;}
/// 定义数组属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB_ASSOCIATED(_TYPE, _Name, _Arg) \
		DIM_ATTRIB_ASSOCIATED_R(_TYPE, _Name, _Arg) \
		virtual inline void Set##_Name(TYPE _val) {_Arg = _val;}


// ****** 调试状态 ******
#include "AF_Log.h"
#include "AF_Debug.h"


// ****** 内存机制 ******
#include "AF_MemManage.h"


// ****** 常用类型定义 ******
namespace AF
{
	/// 指针类型
	typedef void*			Pointer;
	/// 运行次数类型
	typedef	ULONG			RunTimes;
	/// 时间类型
	typedef ULONG			TimeTicks;
	/// 颜色数值类型
	typedef ULONG			ColourCode;
}
typedef AF::Pointer			AF_DPointer;
typedef AF::RunTimes			AF_DRunTimes;
typedef AF::TimeTicks			AF_DTimeTicks;
typedef AF::ColourCode			AF_DColourCode;

namespace AF
{
	/// 句柄类型
	typedef Pointer			Handle;
	/// 对象句柄类型
	typedef Handle			ObjectHandle;
	/// 窗口句柄类型
	typedef ObjectHandle		WindowHandle;
	/// 图像句柄类型
	typedef ObjectHandle		ImageHandle;
	/// 字体句柄类型
	typedef ObjectHandle		FontHandle;

}
typedef AF::Handle			AF_DHandle;
typedef AF::ObjectHandle		AF_DObjectHandle;
typedef AF::WindowHandle		AF_DWindowHandle;
typedef AF::ImageHandle			AF_DImageHandle;
typedef AF::FontHandle			AF_DFontHandle;

namespace AF
{
// 	/// 图像混合类型
// 	typedef UINT			ImageBlendType;
// 	/// 图像混合枚举
// 	enum ImageBlendType
// 	{
// 		/// 无混合
// 		AF_IBT_NOTHING		= 0,
// 		/// 饱和度混合
// 		AF_IBT_SATURATION	= 1 << 1,
// 	};

// 	/// 图像变形枚举
// 	enum EImageTransformType
// 	{
// 		AF_ITT_REVERT,		// 还原
// 		AF_ITT_ZOOM,		// 缩放
// 		AF_ITT_ANGLE		// 旋转
// 	};
}
// typedef AF::CreateWindow		AF_SCreateWindow;
// typedef AF::ImageInfo			AF_SImageInfo;

namespace AF
{
	/// 点结构
	struct Point
	{
		/// 点X轴坐标
		int			nX;
		/// 点Y轴坐标
		int			nY;

		/// 点设置
		void			Set(int x, int y);
	};

	/// 尺寸结构
	struct Size
	{
		/// 尺寸宽度
		UINT			nWidth;
		/// 尺寸高度
		UINT			nHeight;

		/// 尺寸设置
		void			Set(UINT width, UINT height);
	};

	/// 矩形结构
	struct Rect
	{
		/// 矩形左上角X轴坐标
		int			nX;
		/// 矩形左上角Y轴坐标
		int			nY;
		/// 矩形宽度
		UINT			nWidth;
		/// 矩形高度
		UINT			nHeight;

		/// 矩形设置
		void			Set(int x, int y, UINT width, UINT height);
		/// 设置与获得矩形顶部位置
		int			Top(int top = NULL_INT);
		/// 设置与获得矩形底部位置
		int			Button(int button = NULL_INT);
		/// 设置与获得矩形左部位置
		int			Left(int left = NULL_INT);
		/// 设置与获得矩形右部位置
		int			Right(int right = NULL_INT);

		/// 获得矩形尺寸
		Size&			Size();
		/// 获得矩形中心点
		Point&			Center();

		/// 判断是否与另一矩形相交
		bool			Intersect(Rect& other);	// 相交
		/// 判断是否包含另一矩形
		bool			Contains(Rect& other);	// 包含

		/// 获得与另一矩形的相切矩形
		Rect			Cut(Rect& other);	// 相切
		/// 获得与另一矩形的组合矩形
		Rect			Compose(Rect& other);	// 组合

		/// 恒等操作符
		bool			operator==(Rect other);
	};

	/// 颜色结构
	struct Colour
	{
		/// 透明通道值
		BYTE			nAlpha;
		/// 红色值
		BYTE			nRed;
		/// 绿色值
		BYTE			nGreen;
		/// 蓝色值
		BYTE			nBlue;

		/// 颜色设置
		void			Set(BYTE red, BYTE green, BYTE blue, BYTE alpha = 255);
	};
}
typedef AF::Point			AF_SPoint;
typedef AF::Size			AF_SSize;
typedef AF::Rect			AF_SRect;
typedef AF::Colour			AF_SColour;

// ****** 颜色格式 ******
/// ARGB格式颜色
#define AF_ARGB_32(_a, _r, _g, _b)	(((BYTE)(_a)) << 24 | ((BYTE)(_r)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_b)) << 0)
/// RGB格式颜色
#define AF_RGB_24(_r, _g, _b)		(((BYTE)(_r)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_b)) << 0)
/// BGR格式颜色
#define AF_BGR_24(_r, _g, _b)		(((BYTE)(_b)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_r)) << 0)

// ****** 快速创建 ******
namespace AF
{
	inline Point			CreatePoint(int x, int y);
	inline Size			CreateSize(UINT width, UINT height);
	inline Rect			CreateRect(int x, int y, UINT width, UINT height);
	inline Colour			CreateColour(BYTE red, BYTE green, BYTE blue, BYTE Alpha = 255);
}
#define AF_CREATE_POINT			AF::CreatePoint
#define AF_CREATE_SIZE			AF::CreateSize
#define AF_CREATE_RECT			AF::CreateRect
#define AF_CREATE_COLOUR		AF::CreateColour

// ****** 常用类型参数格式 ******
/// 点参数格式
#define AF_ARG_POINT(_point)		_point.nX, _point.nY
/// 尺寸参数格式
#define AF_ARG_SIZE(_size)		_size.nWidth, _size.nHeight
/// 矩形参数格式
#define AF_ARG_RECT(_rect)		_rect.nX, _rect.nY, _rect.nWidth, _rect.nHeight
/// 颜色参数格式
#define AF_ARG_COLOUR(_colour)		_colour.nAlpha, _colour.nRed, _colour.nGreen, _colour.nBlue

// ****** 常量定义 ******
namespace AF
{
	/// 全局原点常量
	const Point	g_atOrigin	= {0, 0};
	/// 全局零尺寸常量
	const Size	g_sZero		= {0, 0};
	/// 全局空矩形常量
	const Rect	g_rNull		= {0, 0, 0, 0};

	/// 全局透明色常量
	const Colour	g_cTransparent	= {0, 0, 0, 0};
	/// 全局白色常量
	const Colour	g_cWhite	= {255, 255, 255, 255};
	/// 全局黑色常量
	const Colour	g_cBlack	= {255, 0, 0, 0};
	/// 全局红色常量
	const Colour	g_cRed		= {255, 255, 0, 0};
	/// 全局绿色常量
	const Colour	g_cGreen	= {255, 0, 255, 0};
	/// 全局蓝色常量
	const Colour	g_cBlue		= {255, 0, 0, 255};
}

/// 原点
#define AF_POINT_ORIGIN			AF::g_atOrigin
/// 零尺寸
#define AF_SIZE_ZERO			AF::g_sZero
/// 空矩形
#define AF_RECT_NULL			AF::g_rNull

/// 透明色
#define AF_COLOUR_TRANSPARENT		AF::g_cTransparent
/// 白色
#define AF_COLOUR_WHITE			AF::g_cWhite
/// 黑色
#define AF_COLOUR_BLACK			AF::g_cBlack
/// 红色
#define AF_COLOUR_RED			AF::g_cRed
/// 绿色
#define AF_COLOUR_GREEN			AF::g_cGreen
/// 蓝色
#define AF_COLOUR_BLUE			AF::g_cBlue

#endif
